#include "h_spi_s_user.h"

#include "h_stm32_hal_defines.h"
#include "h_stm32_hal_timer.h"

#include "h_spi_s.h"

h_spi_s_t h_spi_s_data_t;

#define SPI_CS_PIN						GPIO_PIN_9
#define SPI_CS_PORT						GPIOB
#define SPI_SCK_PIN						GPIO_PIN_10
#define SPI_SCK_PORT					GPIOB
#define SPI_MOSI_PIN					GPIO_PIN_15
#define SPI_MOSI_PORT					GPIOB
#define SPI_MISO_PIN					GPIO_PIN_14
#define SPI_MISO_PORT					GPIOB

//////////////////////////////////////////////////////////////////
static void h_spi_cs_out_init(void)
{
	// __HAL_RCC_GPIOB_CLK_ENABLE();
	GPIO_InitTypeDef GPIO_InitStruct = {0};

	GPIO_InitStruct.Pin = SPI_CS_PIN;
	GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
	GPIO_InitStruct.Pull = GPIO_NOPULL;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
	HAL_GPIO_Init(SPI_CS_PORT, &GPIO_InitStruct);
}

static void h_spi_cs_out_high(void)
{
	HAL_GPIO_WritePin(SPI_CS_PORT, SPI_CS_PIN, GPIO_PIN_SET);
}

static void h_spi_cs_out_low(void)
{
	HAL_GPIO_WritePin(SPI_CS_PORT, SPI_CS_PIN, GPIO_PIN_RESET);
}
//////////////////////////////////////////////////////////////////
static void h_spi_sck_out_init(void)
{
	// __HAL_RCC_GPIOB_CLK_ENABLE();
	GPIO_InitTypeDef GPIO_InitStruct = {0};

	GPIO_InitStruct.Pin = SPI_SCK_PIN;
	GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
	GPIO_InitStruct.Pull = GPIO_NOPULL;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
	HAL_GPIO_Init(SPI_SCK_PORT, &GPIO_InitStruct);
}

static void h_spi_sck_out_high(void)
{
	HAL_GPIO_WritePin(SPI_SCK_PORT, SPI_SCK_PIN, GPIO_PIN_SET);
}

static void h_spi_sck_out_low(void)
{
	HAL_GPIO_WritePin(SPI_SCK_PORT, SPI_SCK_PIN, GPIO_PIN_RESET);
}
//////////////////////////////////////////////////////////////////
static void h_spi_mosi_out_init(void)
{
	// __HAL_RCC_GPIOB_CLK_ENABLE();
	GPIO_InitTypeDef GPIO_InitStruct = {0};

	GPIO_InitStruct.Pin = SPI_MOSI_PIN;
	GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
	GPIO_InitStruct.Pull = GPIO_NOPULL;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
	HAL_GPIO_Init(SPI_MOSI_PORT, &GPIO_InitStruct);
}

static void h_spi_mosi_out_high(void)
{
	HAL_GPIO_WritePin(SPI_MOSI_PORT, SPI_MOSI_PIN, GPIO_PIN_SET);
}

static void h_spi_mosi_out_low(void)
{
	HAL_GPIO_WritePin(SPI_MOSI_PORT, SPI_MOSI_PIN, GPIO_PIN_RESET);
}
//////////////////////////////////////////////////////////////////
static void h_spi_miso_in_init(void)
{
	// __HAL_RCC_GPIOB_CLK_ENABLE();
	GPIO_InitTypeDef GPIO_InitStruct = {0};

	GPIO_InitStruct.Pin = SPI_MISO_PIN;
	GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
	GPIO_InitStruct.Pull = GPIO_NOPULL;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
	HAL_GPIO_Init(SPI_MISO_PORT, &GPIO_InitStruct);
}

static signed char h_spi_miso_read(void)
{
	return HAL_GPIO_ReadPin(SPI_MISO_PORT, SPI_MISO_PIN);
} 

//////////////////////////////////////////////////////////////////
void h_spi_s_user_init(void)
{
	unsigned char data[2] = {0x80, 0x90};
	h_spi_s_data_t.cs_out_init = &h_spi_cs_out_init;
	h_spi_s_data_t.cs_high = &h_spi_cs_out_high;
	h_spi_s_data_t.cs_low = &h_spi_cs_out_low;
	h_spi_s_data_t.sck_out_init = &h_spi_sck_out_init;
	h_spi_s_data_t.sck_high = &h_spi_sck_out_high;
	h_spi_s_data_t.sck_low = &h_spi_sck_out_low;
	h_spi_s_data_t.mosi_out_init = &h_spi_mosi_out_init;
	h_spi_s_data_t.mosi_high = &h_spi_mosi_out_high;
	h_spi_s_data_t.mosi_low = &h_spi_mosi_out_low;
	h_spi_s_data_t.miso_in_init = &h_spi_miso_in_init;
	h_spi_s_data_t.miso_read = &h_spi_miso_read;
	h_spi_s_data_t.delay_us = &delay_us;

	h_spi_s_init(&h_spi_s_data_t);

	// h_spi_s_user_cs_enable();
	// h_spi_s_user_write_bytes(data, 2);
	// h_spi_s_user_cs_dsiable();

}

signed char h_spi_s_user_write_bytes(unsigned char *data, unsigned short len)
{
	h_spi_s_write_buffer(&h_spi_s_data_t, data, len);
	return 0;
}

signed char h_spi_s_user_read_bytes(unsigned char *data, unsigned short len)
{
	h_spi_s_read_buffer(&h_spi_s_data_t, data, len);
	return 0;
}

void h_spi_s_user_cs_enable(void)
{
	h_spi_s_data_t.cs_low();
}

void h_spi_s_user_cs_dsiable(void)
{
	h_spi_s_data_t.cs_high();
}
